From e36c8877da4ca0bb815b333024010f8592bb0039 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 24 Feb 2006 08:49:32 +0100 Subject: [PATCH] Return <4GB memory back to Xen when destroying a PAE pgdir. Signed-off-by: Keir Fraser --- linux-2.6-xen-sparse/arch/i386/mm/init-xen.c | 2 +- linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c index 783ea63964..2ab318c251 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c @@ -759,7 +759,7 @@ void __init pgtable_cache_init(void) #endif 0, pgd_ctor, - PTRS_PER_PMD == 1 ? pgd_dtor : NULL); + pgd_dtor); if (!pgd_cache) panic("pgtable_cache_init(): Cannot create pgd cache"); } diff --git a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c index 869d43ef89..c2d97b5b2d 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c @@ -320,16 +320,20 @@ void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused) } } -/* never called when PTRS_PER_PMD > 1 */ void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused) { unsigned long flags; /* can be called from interrupt context */ - spin_lock_irqsave(&pgd_lock, flags); - pgd_list_del(pgd); - spin_unlock_irqrestore(&pgd_lock, flags); + if (PTRS_PER_PMD > 1) { + if (!xen_feature(XENFEAT_pae_pgdir_above_4gb)) + xen_destroy_contiguous_region((unsigned long)pgd, 0); + } else { + spin_lock_irqsave(&pgd_lock, flags); + pgd_list_del(pgd); + spin_unlock_irqrestore(&pgd_lock, flags); - pgd_test_and_unpin(pgd); + pgd_test_and_unpin(pgd); + } } pgd_t *pgd_alloc(struct mm_struct *mm) -- 2.30.2